perm filename SAMPLE.TEX[105,CSD] blob sn#536187 filedate 1980-09-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	%This is INSERT B
C00004 00003	\sample
C00006 00004	\sample
C00008 00005	\sample
C00010 00006	\sample
C00015 00007	\solution
C00019 00008	\sample
C00023 00009	\sample
C00028 00010	\solution
C00036 00011	\startcode
C00039 00012	\startcode
C00046 ENDMK
C⊗;
%This is INSERT B
\specialbegin{Sample Programs}

\startcode
%p5e1 goes here

(* CONVERSION FROM FAHRENHEIT TO CELSIUS  *)
(* NOTE THAT YOU HAVE TO PUT AN EXTRA SPACE BETWEEN THE TWO COLUMNS TO  *)
(* PREVENT THEM FROM RUNNING TOGETHER.  *)

PROGRAM TEMP (OUTPUT);
VAR FAHR : INTEGER;
BEGIN
FOR FAHR :=  - 20 TO 100 DO
    WRITELN (FAHR, ' ', (FAHR - 32)*5/9)
END.
\endcode

%Definition of Iteration
\penalty500
\topoutput

%p5e1O goes here

         -20 -2.888888895E+01
         -19 -2.833333313E+01
         -18 -2.777777761E+01
         -17 -2.722222238E+01
         -16  2.666666686E+01

           .        .                     
           .        .
           .        .

          96  3.555555522E+01
          97  3.611111104E+01
          98  3.666666656E+01
          99  3.722222238E+01
         100  3.777777761E+01

\botoutput
%End INSERT B
\sample
\startcode

%p5e2 goes here

(* CONVERSION FROM FAHRENHEIT TO CELSIUS. *)
(* GOING DOWN INSTEAD OF UP. *)
PROGRAM TEMP ( OUTPUT );
VAR     FAHR : INTEGER;
BEGIN
FOR FAHR := 100 DOWNTO  - 20 DO
    WRITELN (FAHR , ' ' , (FAHR - 32)*5/9 )
END.

\endcode

\topoutput

%p5e2O goes here


         100   3.777777761E+01
          99   3.722222238E+01
          98   3.666666656E+01
          97   3.611111104E+01
          96   3.555555522E+01

           .         .        
           .         .
           .         .

         -16  -2.666666686E+01
         -17  -2.722222238E+01
         -18  -2.777777761E+01
         -19  -2.833333313E+01
         -20  -2.888888895E+01
\botoutput

\sample
\startcode

%p5e3 goes here

(* CONVERSION FROM FAHRENHEIT TO CELSIUS *)
(*      GOING UP IN STEPS OF 5 INSTEAD OF STEPS OF 1. *)

PROGRAM TEMP (OUTPUT);
VAR  FAHR, FOVER5 : INTEGER;
BEGIN
   FOR FOVER5 :=  - 4 TO 20 DO
      WRITELN (5*FOVER5, ' ', (5*FOVER5 - 32)*5/9);
END.
\endcode

\topoutput

%p5e3O goes here

         -20 -2.888888895E+01
         -15 -2.611111104E+01
         -10 -2.333333313E+01
          -5 -2.055555552E+01
           0 -1.777777761E+01

           .        .       
           .        .
           .        .

          80  2.666666686E+01
          85  2.944444447E+01
          90  3.222222238E+01
          95  3.500000000E+01
         100  3.777777761E+01

\botoutput

\sample

Computing the exponential function by its Taylor expansion.

%p5e5 goes here

\startcode
PROGRAM EXP(INPUT* , OUTPUT ) ;
VAR     I              : INTEGER ;
        X ,                           (* INPUT VALUE *)
        NEXT ,                        (* ONE TERM IN SERIES *)
        SUM            : REAL ;       (* EXP(X) *)
BEGIN
(* INPUT AND INITIALIZATION *)
READ ( X ) ;
SUM := 1.0 ;
NEXT := 1.0 ;
(* SUMMING THE SERIES *)
FOR I := 1 TO 12 DO
    BEGIN
    NEXT := NEXT*X/I ;
    SUM := SUM + NEXT
    END ;
(* OUTPUT *)
WRITELN ( ' X           = ' , X ) ;
WRITELN ( ' EXP(X)      = ' , SUM )
END.

\endcode

\topoutput
%p5e5O goes here

      X          =   1.000000000
      EXP(X)     =   2.718281775
\botoutput
\sample
        Write a PASCAL program that approximates the value of
$$\int↑1↓0 e↑{-x↑2}dx$$
using trapezoidal approximation.  To approximate the area under a curve by 
trapezoids, divide the interval into equal-width subintervals, evaluate the 
function to be integrated at the endpoints of these subintervals, and then 
``connect the dots'' to get trapezoids.  The value of the integral over the
interval [0,1] can then be approximated by the sum of the areas of these trapezoids.  
{\sl (See picture below.)}  Your output should be a table like the following:

{\smallfont
\dtable{\hfill{\tt #}⊗\quad{\tt #}\hfill⊗\quad{\tt #}\hfill\cr
{\sl number of}⊗{\hfill\sl area}⊗{\sl change in approximation}\cr
{\sl subintervals}⊗⊗\cr
1⊗{\sl <approximated area with 1 trapezoid>}⊗{\sl <difference from previous area>}\cr
2⊗{\sl <approximated area with 2 trapezoids>}⊗{\sl <difference from previous area>}\cr
4⊗{\sl <approximated area with 4 trapezoids>}⊗{\sl <difference from previous area>}\cr
8⊗{\sl <approximated area with 8 trapezoids>}⊗{\sl <difference from previous area>}\cr
16⊗{\sl <approximated area with 16 trapezoids>}⊗{\sl <difference from previous area>}\cr
\vdots⊗\hfill\vdots⊗\hfill\vdots\cr
4096⊗{\sl <approximated area with 4096 trapezoids>}⊗{\sl <difference from previous area>}\cr
}%end dtable
}%end smallfont

        Note that $4096 = 2↑{12}$, and the number of subintervais doubles for each
successive approximation.  In the column labelled {\sl <difference from previous
area>}, you should print how much the approximation changed with the larger
number of trapezoids.  For instance, on line 4 of the output (above, where number
of subintervals is 8), the slot {\sl <difference from previous area>} would be
equal to {\sl <approximated area with 8 trapezoids>} minus {\sl <approximated area
with 4 trapezoids>}.  Note there is a problem for the first line of output, since
there is no previous area from which to compute a difference:  so assume the 
previous area was zero.  For any given ``mesh'' (i.e. width of trapezoids for a
particular approximation), you should only have to compute the approximated area
once.

        The PASCAL function that computes exponentials, which we usually write
$e↑x$, is {\tt exp(x)}.  As an example of its use, here's a short program to print a
table of exponents:

\startcode
PROGRAM TABLE (OUTPUT);
VAR    N:  INTEGER;
BEGIN
FOR N:=1 TO 100 DO
    WRITELN(N,EXP(N))
END.
\endcode
%Diagram on p. 1 of hardcopy goes here
\solution
\startcode
(* TRAPEZOID APPROXIMATION TO INTEGRATING THE FUNCTION EXP(-X*X) *)

PROGRAM TRAP (OUTPUT);

VAR     APPROXNO,   (* TELLS WHICH APPROXIMATION WE'RE WORKING ON *)
        NUMTRAPS,   (* THE NUMBER OF TRAPEZOIDS USED IN THIS APPROX. *)
        T           (* KEEPS TRACK OF THE CURRENT TRAPEZOID NUMBER *)
                    (* WITHIN THIS APPROXIMATION *)
                :  INTEGER;

        AREA,       (* RUNNING TOTAL AREA OF ALL TRAPEZOIDS IN APPROX. *)
        LASTAREA    (* AREA FROM LAST APPROXIMATION *)
                :  REAL;

BEGIN

WRITELN('NO.':3, 'NUM OF':12, 'APPROXIMATE':18, 'DIFFERENCE':18);
WRITELN(' ':3, 'TRAPEZOIDS':12, 'AREA':18, 'IN AREA':18);
NUMTRAPS:=1; LASTAREA:=0; (* INITIALIZATION *)
FOR APPROXNO:=0 TO 12 DO
        BEGIN
        (* FIND THE SUM OF THE AREAS OF ALL THE TRAPEZOIDS *)
        AREA:=0;
        FOR T:=0 TO NUMTRAPS - 1 DO
                (* EACH TIME THROUGH THIS LOOP ADDS IN ONE MORE TRAP. *)
                AREA:=AREA + (1/NUMTRAPS) * 0.5 
                       *(EXP( - SQR(T/NUMTRAPS)) + EXP( - SQR((T+1)/NUMTRAPS)));
        (* PRINT OUT THE ANSWER FOR THIS APPROXIMATION *)
        WRITELN(APPROXNO:3, NUMTRAPS:12, ' ':2, AREA, ' ':2, AREA - LASTAREA);
        (* SET UP FOR THE NEXT TIME AROUND *)
        LASTAREA:=AREA;
        NUMTRAPS:=NUMTRAPS*2;
        END
END.
\endcode

\topoutput
NO.      NUM OF       APPROXIMATE        DIFFERENCE
     TRAPEZOIDS              AREA           IN AREA
  0           1   6.839397192E-01   6.839397192E-01
  1           2   7.313702583E-01   4.743053793E-02
  2           4   7.429841041E-01   1.161384582E-02
  3           8   7.458656132E-01   2.881512045E-03
  4          16   7.465846002E-01   7.189884781E-04
  5          32   7.467642664E-01   1.796633005E-04
  6          64   7.468091607E-01   4.489719867E-05
  7         128   7.468203663E-01   1.120567321E-05
  8         256   7.468231856E-01   2.816319465E-06
  9         512   7.468239307E-01   7.450580596E-07
 10        1024   7.468240916E-01   1.639127731E-07
 11        2048   7.468241393E-01   4.470348358E-08
 12        4096   7.468240559E-01  -8.195638656E-08
\botoutput
\endsolution
\sample
%For notes
\startcode
\sendnotes{FRG==>check to see why below line is 72 pts overflow}
(* This solution does not produce the correct output. *)
(* It exhibits two very common programming errors,    *)
(* which you should look out for. *)
%p7e3 goes here
PROGRAM TRAP ( OUTPUT ) ;
VAR     APPROXNO,       (* TELLS WHICH APPROXIMATION WE ARE WORKING ON *)
        NUMTRAPS,       (* THE NUMBER OF TRAPEZOIDS IN THE APPROX.    *)
        T               (* KEEPS TRACK OF THE CURRENT TRAPEZOID      *)
                        (* WITHIN THIS APPROXIMATION                 *)
                :  INTEGER ;
        TRAP,           (* AREA OF ONE TRAPEZOID *)
        AREA,           (* RUNNING TOTAL AREA OF ALL TRAPEZOIDS *)
        LASTAREA        (* AREA FROM LAST APPROXIMATION *)
                :  REAL ;
BEGIN
WRITELN('NO.':3, 'NUM OF':12, 'APPROXIMATE':18, 'DIFFERENCE':18) ;
WRITELN(' ':3, 'TRAPEZOIDS':12, 'AREA':18, 'IN AREA':18) ;
NUMTRAPS := 1 ;
LASTAREA := 0.0 ;
AREA := 0.0 ;   (****THE FIRST ERROR: `AREA' SHOULD BE REINITIALIZED EACH 
                     SUMMATION.  MOVE THIS COMMAND INTO THE FOLLOWING
                     ITERATION. *****)
FOR APPROXNO  := 0 TO 12 DO
    BEGIN             
    (* FIND THE SUM OF THE AREAS OF ALL TRAPEZOIDS *)
    FOR T := 0 TO NUMTRAPS DO
        TRAP := (1.0/NUMTRAPS)*0.5*
                    (EXP(-SQR(T/NUMTRAPS)) + EXP(-SQR((T+1)/NUMTRAPS))) ;
        AREA := AREA + TRAP ;
              (***  THE SECOND ERROR.  THIS STATEMENT IS NOT INSIDE THE 
                    T-ITERATION, SO ONLY THE LAST TRAPEZOID IS ADDED TO
                    THE AREA.  A BEGIN-END PAIR CORRECTS THIS.  ****)
    (* PRINT OUT THE ANSWER FOR THIS APPROXIMATION *)
    WRITELN ( APPROXNO:3, NUMTRAPS:12, ' ':2, AREA, ' ':2, AREA-LASTAREA ) ;
    (* SET UP FOR THE NEXT TIME AROUND *)
    LASTAREA := AREA ;
    NUMTRAPS := NUMTRAPS*2
    END
END.

\endcode
\sample
%for notes

Write a program to do the weekly payroll calculation for an organization.  
For each employee, your program will calculate the gross pay, deductions, and net
pay.  The output will be a file to be sent to the check-writing program (format
explained below), as well as a short summary of how much the organization should
send to the government and insurance company this week.

The data-entry clerks produce a file each week which contains the number of
people currently employed this week, followed by this information for each
employee:

\twocolalign{
Social Security number⊗(9-digit integer)\cr
Hourly pay rate⊗(a real number)\cr
Number of exemptions⊗\cr
Health insurance code⊗(1, 2 or 3; see below)\cr
Hours worked⊗(a real number)\cr
}%end twocolalign

Gross Pay is calculated on the regular hourly pay rate for the first 40 hours,
and time-and-a-half beyond that up to a limit of 54 hours in any given week.  
(If an employee worked 63 hours, he would be paid for 40 hours at regular
pay, 14 hours at time-and-a-half, and wouldn't get a cent for the other nine
hours.)

Deductions are more complicated.  The type of deductions and the method to
compute each:


\bitem Federal income tax withholding:
\dtable{\hfill#⊗#\hfill\cr
$Taxable\; Pay$⊗$ = Gross\; Pay -$ \$ $14\times(Number\; of\; Exemptions)-$ \$ $11$\cr
$Withholding$⊗$ = Taxable\; Pay\times(0.14 + 2.3\times10↑{-4}\times Taxable\; Pay)$\cr}

\bitem State income tax withholding:
$$31\%\; of\; Federal\;  withholding$$

\bitem Social Security Tax:
\dtable{\hfill#⊗#\hfill\cr
$The\; smaller\; of$ \$ $16.70$⊗$\; or\; 7.7\%\; of\; Gross\; Pay$\cr}

\bitem Health Insurance:
\dtable{\hfill#⊗#\hfill\cr
$1$⊗$--No\; coverage.\; \; ($\$$0\; per\; week)$\cr
$2$⊗$--Employee\; coverage\; only.\; \; ($\$$2\; per\; week)$\cr
$3$⊗$--Family\; coverage\; ($\$$7.50\; per\; week)$\cr
}
\endcode


\noindent
Net Pay is simply gross pay minus all deductions.  Your program reads each
employee's data, calculates his taxes and deductions, and writes a line in the
output file containing his social security number and net pay.  After the last
employee has been processed, a summary report showing the number of employees
processed, total gross pay, total deductions of each type, and total net pay
is to be printed on the terminal.

Your program should perform reasonable operations for all possible input data.
For example,if someone hasn't made enough this week to cover all his deductions,
then none get withheld, but a message should be printed out on the terminal to
tell the payroll clerk to manually intervene to correct things next week.






\solution
\startcode

(*THIS PROGRAM PROCESSES A WEEKLY PAYROLL.*)
(*INPUT  : FIRST LINE  : NUMBER OF PEOPLE EMPLOYED*)
(*         NEXT LINES  : DATA FOR EACH EMPLOYEE, ONE PER LINE*)
(*                        SOCIAL SECURITY NUMBER ( INTEGER )*)
(*                        HOURLY PAY RATE ( REAL )*)
(*                        NUMBER OF EXEMPTIONS ( INTEGER )*)
(*                        HEALTH INSURANCE CODE ( 1, 2 OR 3 )*)
(*                        NUMBER OF HOURS WORKED ( REAL )*)
(*OUTPUT : TO OUTPUT FILE : CHECK WRITING DATA FOR EACH EMPLOYEE,*)
(*                          ONE PER LINE*)
(*                            SOCIAL SECURITY NUMBER*)
(*                            NET PAY*)
(*        TO TERMINAL  : EXCEPTION CONDITIONS ( IF ANY )*)
(*                       SUMMARY INFORMATION FOR THE COMPANY*)
(*                         NUMBER OF EMPLOYEES*)
(*                         TOTAL GROSS PAY*)
(*                         TOTAL FEDERAL TAX DEDUCTIONS*)
(*                         TOTAL STATE TAX DEDUCTIONS*)
(*                         TOTAL HEALTH INSURANCE DEDUCTIONS*)
(*                         TOTAL OVERALL DEDUCTIONS*)
(*                         TOTAL NET PAY*)
(*THE DEDUCTIONS ARE COMPUTED AS FOLLOWS:*)
(* TAXABLE INCOME -- GROSS PAY $-$14*EXEMPTIONS $-$ 11*)
(* FEDERAL TAX    -- TAXABLE INCOME*(0.14 + 2.3E$-$4*TAXABLE INCOME)*)
(* STATE TAX      -- .31*FEDERAL TAX*)
(* HEALTH INSURANCE-- 0.0  IF CODE = 1*)
(*                    2.0  IF CODE = 2*)
(*                    7.5  IF CODE = 3*)
(*IF THE TAXABLE INCOME IS NEGATIVE, NO TAX DEDUCTIONS ARE MADE. *)
(*IF THE TOTAL DEDUCTIONS EXCEED THE GROSS PAY, NO DEDUCTIONS ARE*)
(*MADE AND A MESSAGE IS SENT TO THE TERMINAL.*)
\endcode
\startcode
PROGRAM PAYROLL ( INPUT*, OUTPUT ) ;

VAR     NUMEMPLOYEE,               (* NUMBER OF EMPLOYEES*)
        SSNUMBER,                  (* SOCIAL SECURITY NUMBER*)
        NUMEXEM,                   (* NUMBER OF EXEMPTIONS*)
        HEALTHCODE,                (* HEALTH INSURANCE CODE*)
        I               : INTEGER ;
        PAYRATE,                   (* HOURLY PAY RATE*)
        HOURS,                     (* HOURS WORKED*)
        GROSSPAY,                  (* GROSS PAY*)
        TAXABLEPAY,                (* TAXABLE PAY*)
        FEDTAX,                    (* FEDERAL TAX*)
        STATETAX,                  (* STATE TAX*)
        SSTAX,                     (* SOCIAL SECURITY TAX*)
        HEALTHINS,                 (* HEALTH INSURANCE WITHHOLDING*)
        TOTALDEDUCT,               (* TOTAL OF DEDUCTIONS*)
        NETPAY,                    (* NET PAY*)
        SUMGROSSPAY,SUMFEDTAX,     (* SUMS OVER ALL EMPLOYEES/LDOTS*)
        SUMSTATETAX,SUMSSTAX,
        SUMHEALTHINS,SUMTOTALDEDUCT,
        SUMNETPAY       : REAL ;

BEGIN

(* READ NUMBER OF EMPLOYEES AND INITIALIZE *)
READ ( NUMEMPLOYEE ) ;
SUMGROSSPAY := 0.0 ;
SUMFEDTAX := 0.0 ;
SUMSTATETAX := 0.0 ;
SUMSSTAX := 0.0 ;
SUMHEALTHINS := 0.0 ;
SUMTOTALDEDUCT := 0.0 ;
SUMNETPAY := 0.0 ;

\endcode
\startcode
(* PROCESS EMPLOYEE'S DATA *)
FOR I := 1 TO NUMEMPLOYEE DO
   BEGIN

   (* READ EMPLOYEE'S DATA *)
   READ ( SSNUMBER, PAYRATE, NUMEXEM, HEALTHCODE, HOURS ) ;

   (* CHECK DATA FOR VALIDITY *)
   IF ( SSNUMBER < 100000000 ) OR
      ( SSNUMBER > 999999999 ) OR
      ( PAYRATE < 0.0 ) OR
      ( NUMEXEM < 0 ) OR
      ( HEALTHCODE < 1 ) OR
      ( HEALTHCODE > 3 ) OR
      ( HOURS < 0.0 )
       THEN WRITELN( TTY, 'INVALID DATA ON LINE', I:4 )

   ELSE
       BEGIN
       (* CALCULATE GROSS PAY *)
       IF HOURS <= 40.0  THEN
           GROSSPAY := HOURS*PAYRATE
       ELSE                 
           IF HOURS <= 54.0 THEN
               GROSSPAY := 40.0*PAYRATE + (HOURS-40.0)*1.5*PAYRATE
           ELSE GROSSPAY := 61.0*PAYRATE ;

       (* SUM GROSS PAY *)
       SUMGROSSPAY := SUMGROSSPAY + GROSSPAY ;
       (* CALCULATE DEDUCTIONS *)
       TAXABLEPAY := GROSSPAY-14.0*NUMEXEM-11.0 ;
       IF TAXABLEPAY < 0.0 THEN TAXABLEPAY := 0.0 ;
       FEDTAX := TAXABLEPAY * ( 0.14 + 2.3E-4 * TAXABLEPAY ) ;
       STATETAX := 0.31 * FEDTAX ;
       SSTAX := 0.077 * GROSSPAY ;
       IF SSTAX > 16.7 THEN SSTAX := 16.7 ;
\allowbreak
       IF HEALTHCODE = 1  THEN
           HEALTHINS := 0.0
       ELSE                        
           IF HEALTHCODE = 2  THEN
               HEALTHINS := 2.0
           ELSE HEALTHINS := 7.5 ;

       TOTALDEDUCT := FEDTAX + STATETAX + SSTAX + HEALTHINS ;
\allowbreak
       (* CHECK IF EARNINGS COVER DEDUCTIONS AND CALCULATE NET PAY *)
       (* ALSO SUM THE DEDUCTIONS AND THE NET PAY *)

       IF TOTALDEDUCT > GROSSPAY  THEN
           BEGIN
           WRITELN ( TTY, ' EMPLOYEE NUMBER ', SSNUMBER:9 ) ;
           WRITELN ( TTY, ' EARNINGS DO NOT COVER WITHHOLDINGS' ) ;
           WRITELN ( TTY, ' NO WITHHOLDINGS MADE THIS WEEK.' ) ;
           WRITELN ( TTY ) ;
           NETPAY := GROSSPAY
           END
       ELSE
           BEGIN
           NETPAY := GROSSPAY-TOTALDEDUCT ;
           SUMFEDTAX := SUMFEDTAX + FEDTAX ;
           SUMSTATETAX := SUMSTATETAX + STATETAX ;
           SUMSSTAX := SUMSSTAX + SSTAX ;
           SUMHEALTHINS := SUMHEALTHINS + HEALTHINS ;
           SUMTOTALDEDUCT := SUMTOTALDEDUCT + TOTALDEDUCT 
           END;
       SUMNETPAY := SUMNETPAY + NETPAY ;
       WRITELN ( SSNUMBER :9 , NETPAY :14 :2 )
       END  (* ELSE CLAUSE *)
   END ;  (* FOR LOOP *)
\allowbreak

(* SEND SUMMARY REPORT TO TERMINAL *)

WRITELN ( TTY, ' SUMMARY REPORT : ' ) ;
WRITELN ( TTY, ' -----------------' ) ;
WRITELN ( TTY, ' TOTAL GROSS PAY' :40, SUMGROSSPAY :20 :2 ) ;
WRITELN ( TTY, ' FEDERAL INCOME TAX DEDUCTIONS' :40, SUMFEDTAX :20 :2 ) ;
WRITELN ( TTY, ' STATE INCOME TAX DEDUCTIONS' :40, SUMSTATETAX :20 :2 ) ;
WRITELN ( TTY, ' SOCIAL SECURITY DEDUCTIONS' :40, SUMSSTAX :20 :2 ) ;
WRITELN ( TTY, ' HEALTH INSURANCE DEDUCTIONS' :40, SUMHEALTHINS :20 :2 ) ;
WRITELN ( TTY, ' TOTAL DEDUCTIONS' :40, SUMTOTALDEDUCT :20 :2 ) ;
WRITELN ( TTY, ' TOTAL NET PAY' :40, SUMNETPAY :20 :2 ) 
END.

\endcode
\endsolution